package com.aaa.util;

/**
 * 该工具类提供了与地理位置相关的工具方法。
 * 目前主要功能是计算地球上两个坐标点之间的距离。
 */
public class LocationUtils {
    /**
     * 地球的平均半径，单位为千米。
     * 该值是一个常量，在计算地球表面两点间距离时使用。
     */
    private static final double EARTH_RADIUS = 6371.0;

    /**
     * 此方法用于计算地球上任意两个坐标点之间的球面距离。
     * 它采用 Haversine 公式来考虑地球的曲率，以提供较为准确的距离计算结果。
     *
     * @param lat1 第一个坐标点的纬度，以度为单位。
     * @param lon1 第一个坐标点的经度，以度为单位。
     * @param lat2 第二个坐标点的纬度，以度为单位。
     * @param lon2 第二个坐标点的经度，以度为单位。
     * @return 返回这两个坐标点之间的球面距离，单位为千米。
     */
    public static double calculateDistance(double lat1, double lon1, double lat2, double lon2) {
        // 将纬度差转换为弧度，因为三角函数运算需要弧度值
        double dLat = Math.toRadians(lat2 - lat1);
        // 将经度差转换为弧度
        double dLon = Math.toRadians(lon2 - lon1);

        // 计算 Haversine 公式中的中间变量 a
        double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
                Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
                        Math.sin(dLon / 2) * Math.sin(dLon / 2);

        // 计算 Haversine 公式中的中间变量 c
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

        // 根据 Haversine 公式，通过地球半径乘以 c 得到两点间的球面距离
        return EARTH_RADIUS * c;
    }
}